(function () {
    "use strict";

    angular.module('core').controller('servicoAssincronoController', controller);
    controller.$inject = ['$scope', '$filter', '$interval', 'servicoAssincronoService'];

    function controller($scope, $filter, $interval, servicoAssincronoService) {
        $scope.initializeLayout('Serviços do Assíncronos');

        $scope.state = {
            servicos: {
                data: [],
                filtro: {
                    args: {
                        chaves: null,
                        filtro: null,
                        sortExpression: null,
                        skip: 0,
                        take: 1000,
                    },
                },
            },
            selectedItem: null,
            selectedEvento: null,
            carregando: false,
            vazio: false,
        };
        $scope.auxiliar = {
            horas: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
            minutos: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
            frequencias: [{ id: 0, nome: 'Intervalo' }, { id: 1, nome: 'Lista de determinadas horas do dia' }],
        };
        $scope.timer = {
            segundos: 20,
            corrente: 0,
        };

        var promise

        /* funções */
        $scope.initialize = function () {
            $scope.clearSelectedItem();
            $scope.refresh();

            var promise = $interval(function () {
                if ($scope.timer.corrente == 0)
                    $scope.timer.corrente = $scope.timer.segundos;

                if ($scope.timer.corrente == $scope.timer.segundos)
                    $scope.refresh();

                $scope.timer.corrente--;
            }, 1000);

        };

        $scope.getServicoAssincrono = function () {
            servicoAssincronoService
                .get($scope.state.selectedItem.eventos.filtro.args.servicoAssincronoID)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        $scope.state.selectedItem.item = response.Data;
                        $scope.getAllEventoAssincrono();
                    }
                },
                function (_error) {
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };
        $scope.getAllServicoAssincrono = function () {
            servicoAssincronoService
                .getAll($scope.state.servicos.filtro.args)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        angular.copy(angular.fromJson(response.Data), $scope.state.servicos.data);
                    }
                    $scope.state.carregando = false;
                    $scope.state.vazio = ($scope.state.servicos.data == 0);
                },
                function (_error) {
                    $scope.state.carregando = false;
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };
        $scope.getEventoAssincrono = function () {
            servicoAssincronoService
                .getEvento($scope.state.selectedItem.selectedEvento.ID)
                .then(
                function (response) {

                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        $scope.state.selectedItem.selectedEvento = response.Data;
                    }
                },
                function (_error) {
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };
        $scope.getAllEventoAssincrono = function () {
            servicoAssincronoService
                .getAllEvento($scope.state.selectedItem.eventos.filtro.args)
                .then(
                function (response) {

                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {

                        angular.copy(angular.fromJson(response.Data), $scope.state.selectedItem.eventos.data);
                    }
                },
                function (_error) {
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };
        $scope.getMoreEventoAssincrono = function () {
            $scope.state.selectedItem.eventos.filtro.args.skip += $scope.state.selectedItem.eventos.filtro.args.take;
            $scope.getAllEvento();
        };

        $scope.refresh = function () {
            $scope.getAllServicoAssincrono();
        };

        $scope.selectItem = function (id) {
            $scope.clearSelectedItem();
            $scope.state.selectedItem.eventos.filtro.args.servicoAssincronoID = id;
            $scope.getServicoAssincrono();
        };
        $scope.clearSelectedItem = function () {
            $scope.state.selectedItem = {
                item: null,
                tabCorrente: 0,
                selectedEvento: null,
                eventos: {
                    data: [],
                    filtro:
                    {
                        args: {
                            servicoAssincronoID: null,
                            sortExpression: null,
                            skip: 0,
                            take: 20,
                        },
                    },
                },
            }
        };

        $scope.selectEvento = function (index) {
            $scope.state.selectedItem.selectedEvento = $scope.state.selectedItem.eventos.data[index];
        };
        $scope.clearSelectedEvento = function () {
            if ($scope.state.selectedItem)
                $scope.state.selectedItem.selectedEvento = null;
        };

        $scope.initialize();

    }
})();